package drugdealer.persistencia;

import java.sql.*;
import java.util.Iterator;
import java.util.Vector;

import drugdealer.dados.Endereco;
import drugdealer.dados.Paciente;
import drugdealer.persistencia.exceptions.AlreadyExistsException;
import drugdealer.persistencia.exceptions.DoesNotExistsException;

public class PacientePersistence extends TablePersistence implements IPacientePersistence {
	public static String TABLENAME = "paciente";
	public static String PRIMARYKEY = "cpf";
	
	public PacientePersistence(DDPersistence owner) {
		super(owner);
		this.tableName = PacientePersistence.TABLENAME;
		PacientePersistence.PRIMARYKEY = PacientePersistence.PRIMARYKEY;
		this.createTableStmt =
			"CREATE TABLE IF NOT EXISTS " + PacientePersistence.TABLENAME + "(" +
			PacientePersistence.PRIMARYKEY + " varchar(11) PRIMARY KEY NOT NULL," +
			"nome varchar(60)," +
			"rg varchar(16)," +
			"email varchar(60)," +
			"telefone1 varchar(20)," +
			"telefone2 varchar(20)," +
			"telefone3 varchar(20)," +
			"rua varchar(60)," +
			"numero integer," +
			"complemento varchar(20)," +
			"bairro varchar(40)," +
			"cidade varchar(40)," +
			"pais varchar(40)," +
			"estado varchar(2)," +
			"cep varchar(8)" +
			")";
	}

	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IPacientePersistence#get(java.lang.String)
	 */
	public Paciente get(String cpf) {
		Paciente paciente = null;
		String selectRemedios = "SELECT * FROM " + PacientePersistence.TABLENAME + 
				" WHERE cpf='" + cpf + "'";
		try {
			Statement s = this.ddc.createStatement();
			ResultSet rs = s.executeQuery(selectRemedios);
			
			if (rs.next()) {
				paciente = new Paciente(rs.getString("cpf"), rs.getString("nome"),
						rs.getString("rg"), rs.getString("email"),
						new Endereco(rs.getString("rua"), rs.getInt("numero"),
								rs.getString("complemento"), rs.getString("bairro"),
								rs.getString("cidade"), rs.getString("estado"),
								rs.getString("pais"), rs.getString("cep")
						)
				);
				
				String telefone;
				for (int i = 1; i <= 3; i++) {
					telefone = rs.getString("telefone" + i);
					if (telefone != null)
						paciente.addTelefone(telefone);
				}
			}
			rs.close ();
			s.close ();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return paciente;
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IPacientePersistence#getList()
	 */
	public Vector<String[]> getList() {
		Vector<String[]> list = new Vector<String[]>();
		String selectList = "SELECT q." + PacientePersistence.PRIMARYKEY + 
			",p.nome FROM (SELECT " + PacientePersistence.PRIMARYKEY + 
			" FROM " + PacientePersistence.TABLENAME + " EXCEPT SELECT " + 
			MedicoPersistence.PRIMARYKEY + " FROM " + MedicoPersistence.TABLENAME +
			" EXCEPT SELECT " + FuncionarioPersistence.PRIMARYKEY + " FROM " + 
			FuncionarioPersistence.TABLENAME + ") q, " + 
			PacientePersistence.TABLENAME + " p WHERE q." + 
			PacientePersistence.PRIMARYKEY + "=p." + 
			PacientePersistence.PRIMARYKEY;
		
		System.out.println(selectList);
		
		String[] pair;
		try {
			Statement s = this.ddc.createStatement();
			ResultSet rs = s.executeQuery(selectList);
			
			while (rs.next()) {
				pair = new String[2];
				pair[0] = rs.getString(PacientePersistence.PRIMARYKEY);
				pair[1] = rs.getString("nome");
				list.add(pair);
			}
			rs.close ();
			s.close ();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return list;
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IPacientePersistence#getList(java.lang.String)
	 */
	public Vector<String[]> getList(String columnValue) {
		return super.getList(
				PacientePersistence.PRIMARYKEY, "nome", columnValue);
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IPacientePersistence#add(drugdealer.dados.Paciente)
	 */
	public void add(Paciente paciente) throws AlreadyExistsException {
		String insPaciente = "INSERT INTO " + PacientePersistence.TABLENAME +
				" VALUES ('" + paciente.getCPF() + "','" + paciente.getNome() +
				"','" + paciente.getRG() + "','" + paciente.getEmail() + "', ";

		Iterator it = paciente.getTelefones();
		for (int i = 0; i < 3; i++)
			if (it.hasNext())
				insPaciente += "'" + (String) it.next() + "', ";
			else
				insPaciente += "'', ";
		
		Endereco end = paciente.getEndereco();
		insPaciente += "'" + end.rua + "'," + end.numero + ",'" + 
				end.complemento + "','" + end.bairro + "','" + end.cidade +
				"','" + end.estado + "','" + end.pais + "','" + end.cep + "')";

		super.add(insPaciente);
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IPacientePersistence#update(drugdealer.dados.Paciente)
	 */
	public void update(Paciente paciente) throws DoesNotExistsException {
		String updatePaciente = "UPDATE " + PacientePersistence.TABLENAME +
		" SET nome='" + paciente.getNome() + "'," + 
		"rg='" + paciente.getRG() + "'," +
		"email='" + paciente.getEmail() + "',";
		
		Iterator it = paciente.getTelefones();
		for (int i = 1; i <= 3; i++) {
			updatePaciente += "telefone" + i + "='";
			if (it.hasNext())
				updatePaciente += (String) it.next();
			updatePaciente += "', ";
		}

		Endereco end = paciente.getEndereco();
		updatePaciente += "rua='" + end.rua + "',numero=" + end.numero + "," +
				"complemento='" + end.complemento + "',bairro='" + end.bairro +
				"',cidade='" + end.cidade + "',estado='" + end.estado + "'," +
				"pais='" + end.pais + "',cep='" + end.cep + "'";

		updatePaciente += " WHERE cpf='" + paciente.getCPF() + "'";
		
		super.update(updatePaciente);
	}
	
	/* (non-Javadoc)
	 * @see drugdealer.persistencia.IPacientePersistence#remove(drugdealer.dados.Paciente)
	 */
	public void remove(Paciente paciente) {
		super.remove(PacientePersistence.TABLENAME, 
				PacientePersistence.PRIMARYKEY, paciente.getCPF());
	}

}
